# 定义模型django.db.models.Model的子类
from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User
from  taggit.managers import TaggableManager
from django.shortcuts import reverse
from ckeditor.fields import RichTextField
#定制模型管理器
class PublishedManager(models.Manager):
    def get_queryset(self):
        #get_queryset()返回将被执行的QuerySet
        return super(PublishedManager, self).get_queryset().filter(status='published')

#帖子分类
class Category(models.Model):
    class_name=models.CharField(max_length=250,verbose_name='类名')
    class Meta:
        verbose_name = '分类'
        verbose_name_plural = verbose_name

class Post(models.Model):
    # 字段中使用choices属性时会使用status_choices,此时这个字段就会有value和  display_name两个值
    # 如，先查询到表对象，然后 对象.get_拥有choioce属性的字段_display
    # ((0,'女'),(1,'男'))可用于存储固定的字符串，用数或字母代替，减少数据库的存储压力
    STATUS_CHOICES = (
        ('draft', '草稿'),
        ('published', '已发布'))
    # 新增 views 字段记录阅读量
    views = models.PositiveIntegerField(default=0, editable=False,verbose_name='阅读量')

    # 帖子标题字段
    title = models.CharField(max_length=250,verbose_name='帖子标题')

    # url优化  #实现语义化，构建短网址，拼接url路由(www.aaa.com/短网址)
    # unique_for_date="publish"，采用发布日期和slug对帖子构建URL
    slug = models.SlugField(max_length=250, unique_for_date="publish",verbose_name='短网址')

    # 关联user模型
    author = models.ForeignKey(User, on_delete=models.CASCADE, related_name='blog_posts',verbose_name='用户')

    # 表示帖子主体
    body = models.TextField(verbose_name="帖子内容")

    # 表示帖子的发布日期，使用Django时区的now方法
    publish = models.DateTimeField(default=timezone.now,verbose_name='发布日期')

    # 表示帖子的创建日期，使用auto_now_add当创建某个对象时，时间将自动保存
    created = models.DateTimeField(auto_now_add=True,verbose_name='创建日期')

    # 最后一次的更新时间，使用auto_now，保存某个对象时日期将被自动保存
    updated = models.DateTimeField(auto_now=True,verbose_name='更新时间')

    # 显示帖子状态，默认为草稿
    status = models.CharField(max_length=10, choices=STATUS_CHOICES, default='draft',verbose_name='帖子状态')

    #分类
    category = models.ForeignKey("Category",on_delete=models.CASCADE, related_name='posts_category')

    #标签
    tags = TaggableManager(verbose_name='标签')
    objects = models.Manager()  # 这个是默认的模型管理器
    published = PublishedManager()  # 这个我们新创建的模型管理器
    class Meta():
        # 排序规则,保证看到最新的帖子，通过发布时间排序9
        ordering = ('-publish',)
        verbose_name = '博文'
        verbose_name_plural=verbose_name

    # 利用print打印这个querset对象时，会显示这个对象的title
    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('blog:post_single',
                           args=[self.publish.year,
                                 self.publish.month,
                                 self.publish.day,
                                 self.slug])
    def increase_views(self):
        self.views += 1
        self.save(update_fields=['views'])

#评论
class Comment(models.Model):
    #可以通过Post.comments.all()检索帖子的全部评论
    post = models.ForeignKey(Post,
                             on_delete=models.CASCADE,
                             related_name='comments',verbose_name='对应博文')
    name = models.CharField(max_length=80,verbose_name='名称')
    email = models.EmailField(verbose_name='邮箱')
    body = RichTextField(verbose_name='内容')
    created = models.DateTimeField(auto_now_add=True,verbose_name='创建日期')
    updated = models.DateTimeField(auto_now=True,verbose_name='更新日期')
    active = models.BooleanField(default=True,verbose_name='状态')

    class Meta:
        ordering = ('created',)
        verbose_name = '评论'
        verbose_name_plural = verbose_name
    def __str__(self):
        return '在{}通过{}发布评论'.format(self.post,self.name)


class Brief(models.Model):
    #图片
    img=models.CharField(max_length=100,verbose_name='关于图片')
    #博客背景图
    body_img=models.CharField(max_length=100,verbose_name='背景图片')
    #背景图透明度
    opacity=models.FloatField(max_length=20,verbose_name='透明度')
    #简介
    letter=models.TextField(verbose_name='简介')

    @property
    def post_img(self):
        return self.img

    @property
    def postbd_img(self):
        return self.body_img

    @property
    def post_letter(self):
        return self.letter

    @property
    def post_opacity(self):
        return self.opacity
    class Meta:
        verbose_name = '关于'
        verbose_name_plural = verbose_name